本文大部分内容翻译自一篇Git好文(原文地址),经过我拙劣的英文加上自定义的删减与修改~ 也作为Git系列的开头篇
Interactive stage
你也许经常会遇到在对一个文件的多次不同的修改,并且在提交的时候常犹豫哪一段修改是需要commit,这时你可以使用:
git add/commit -p <FILE>
加上 -p
参数之后,git会一块一块的显示出差异,确认当前块是否需要暂存。这样你可以提交文件中的部分修改,还可以使用 -i
参数,更为详细的交互式界面。
ps: 使用交互式的提交不仅能让Commit更加的准确,还可以对代码进行一次很好的review,是值得养成的一个好习惯
Checkout Your Last Branch
当你正忙碌的工作在当前分支下,此时有紧急需求需要对之前的主分支做一些修改,
这时候常用的操作流:
git stash
git checkout develop
//修改提交后 ...commit..push..
git checkout xxx
git stash pop
你可能觉得这样很繁琐乏味,你需要这样的操作:
git checkout -
//切换到develop分支 ...commit...push
git checkout -
这样可以快速切换分支,只能切换到当前分支的上一级母分支,和*NIX的 cd -
类似。
Show Which Branches are Merged (or not)
工作中经常同时工作于多个分支之上,一个项目的feature分支会非常的多,可以通过 branch --list/-l
看到,常遇到情况是,当想清理分支的时候心理还带着一丝犹豫,担心这个分支是否合并到主分支过,或者经常忘记哪些分支合并过,哪些没有。一般情况下都去查看pr记录,或者检查commit信息。
那你可能需要是以下的操作:
git branch --no-merged
可以查看有哪些分支还没有合并到当前的分支, 当然也可以查看哪些已经合并过:
git branch --merged
并且还可以配合一些简单的UNIX工具来执行迅速的删除操作,像这样:
git branch --merged | xargs git branch -d
Grab a File from Another Branch without Switching Branches
当你在做一些类似重构的工作时,你可能需要从多个分支中取出不同的几个修改纳入到当前的分支来。
如果没有下面的提示,你可能进行的操作是:
while(true){
stash 当前修改
切换分支
找出修改的部分,copy到临时文件
checkout -
粘贴到该修改的地方
}
或者你可以进行简单的文件迁移工作:
git checkout <BRANCH> -- path/to/file.rb
eg:
#把tmp分支的 .gitignore 修改迁移到本分支
git checkout tmp -- ./.gitignore
注意,这里是整个文件的覆盖,并不是合并。
Git Branches Sorted by Last Commit
你应该已经看到了本地的一大堆杂乱的分支,并且使用之前的 --merged
清理过其中一些分支了,那对于剩下的分支,该如何确定哪些是有用的,哪些是过时的呢?
for-each-ref
命令会输出每个分支列表,并且显示最后一次的提交信息。重要的是,我们还可以对列表进行日期的排序,以下命令会显示整个分支列表以及最后一次提交信息和提交者,并且按日期降序排序。
//这是原版
git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) [%(committername)]'
//原版并没有输出commit时的message,以下是我个人使用的改良版
git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) "%(subject)" [%(committername)]'
建议给它取一个别名,方便日后使用。
git config --global alias.latest "for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) "%(subject)" [%(committername)]'"